//找到连续的子序列相加等于k
#include <iostream>
#include <unordered_map>
#include <vector>

class Solution {
public:
    int subarraySum(std::vector<int>& nums, int k) {
        //创建一个map用来记录前缀和，以及前缀和出现的次数
        std::unordered_map<int, int> mp;
        //初始化第一个元素的前缀和
        mp[0] = 1;
        //返回个数
        int count = 0;
        //前缀和
        int pre_value = 0;
        for(auto num : nums)
        {
            pre_value += num;
            //前缀和减去k的值，如果说存在，那么就说明该前缀和减去某一个前缀和的值的区间构成了k值
            if(mp.find(pre_value - k) != mp.end())
            {
                count += mp[pre_value - k];
            }
            mp[pre_value]++;
        }
        return count;
    }
};

//如果用滑动窗口的话，思考负数内容，负数的话，指针左移动是增大数据，而纯正数的话，指针左移动是减小数据
//这里的是有序的序列，所以可以使用unordered_map去存储前缀和，但是无序的话，就不可以了。

//想要求区间和的时候，可以使用前缀和相减来求